perm filename DEBUG.VLI[VLI,LSP] blob sn#381971 filedate 1978-09-08 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 TRACE UNTRACE 
C00006 00003	 STEP UNSTEP 
C00009 ENDMK
CāŠ—;
; TRACE UNTRACE ;
  
   (DF TRACE (%F ;; %X %Y) 
      ; force le bit trace de n'importe quel type de fonction ;
      (SETQ TRACE %F)
      ; TRACE contient la liste des fonctions (cf UNTRACE) ;
      (MAPC %F 
         '(LAMBDA (%F) 
            (IF (MEMQ (TYPEFN %F) '(SUBR FSUBR)) 
               (LESCAPE (STATUS 28 %F)))
            (SETQ %X
                (COND
                   ((SETQ %Y (GET %F EXPR)) EXPR)
                   ((SETQ %Y (GET %F FEXPR)) FEXPR)))
            (PUT %F %Y 'TRACE)
            (PUT %F 
               [LAMBDA
                (CADR %Y)
                (CONS '%PTRAC 
                  (CONS [QUOTE %F] 
                    (IF (LISTP (CADR %Y)) 
                       (CADR %Y)
                       (CONS (CADR %Y)))))]
               %X)))
      %F)
  
   (DE %PTRAC (%F . %L) 
      ;%F = FUNC NAME ;
      (PRINT '-----> %F '/ /  %L)
      ;%L = (VALA1 VALA2 ... VALAN) ;
      (SETQ %X (EPROGN (CDDR (GET %F 'TRACE))))
      (PRINT '<----- %F '/ /  %X))
  
   (DF UNTRACE (%F) 
      ; enleve la TRACE des fonctions contenues dans %F ;
      (OR %F (SETQ %F (AND (BOUNDP 'TRACE) TRACE))
	 (LESCAPE "UNTRACE quoi ?"))
      (MAPC %F
         '(LAMBDA (%F) 
            (IF (MEMQ (TYPEFN %F) '(SUBR FSUBR)) 
               (LESCAPE (STATUS 29 %F)))
            (PUT %F (GET %F 'TRACE) (IF (GET %F EXPR) EXPR FEXPR))
            (REMPROP %F 'TRACE)))
      %F)
  
   (DE %TRTF (%X2 %X1) 
      (MAPC %L '(LAMBDA (%L) (%RPL %X1 %X2 (CDR %L)))))
  
   (DE %RPL (%X %Y %L) 
      (WHILE (LISTP %L) 
         (COND
            ((LISTP (CAR %L)) (%RPL %X %Y (CAR %L)))
            ((EQ (CAR %L) %X) (RPLACA %L %Y)))
         (NEXTL %L)))
  
   (DF TRACEQ (%L) (%TRTF '%TSETQ 'SETQ))
  
   (DF UNTRACQ (%L) (%TRTF 'SETQ '%TSETQ))
  
   (DF TRACEGO (%L) (%TRTF '%TGO 'GO))
  
   (DF UNTRACG (%L) (%TRTF 'GO '%TGO))
  
   (DF %TSETQ (%L) 
      (SET
         (PRIN1 (CAR %L)) 
          (PROGN (PRIN1 '=) (PRINT (EVAL (CADR %L))))))
  
   (DF %TGO (%L) (PRINT (CONS 'ETIQ: %L)) (GOTO (CAR %L)))
; STEP UNSTEP ;

   (DF STEP (%F ;; %X %Y) 
      ; force les bits step de fonctions de type EXPR ou FEXPR ;
      (SETQ STEP %F)
      ; STEP contient la liste des fonctions (cf UNSTEP) ;
      (TEREAD)
      (MAPC %F
         '(LAMBDA (%F) 
            (SETQ %X
                (COND
                   ((SETQ %Y (GET %F EXPR)) EXPR)
                   ((SETQ %Y (GET %F FEXPR)) FEXPR)))
            (PUT %F %Y 'STEP)
            (PUT %F 
               [LAMBDA
                (CADR %Y)
                (CONS '%PSTEP 
                  (CONS [QUOTE %F] 
                    (IF (LISTP (CADR %Y)) 
                       (CADR %Y)
                       (CONS (CADR %Y)))))]
               %X)))
      %F)
  
   (DE %PSTEP (%F . %L) 
      ;%F = FUNC NAME ;
      (PRINT '-----> %F '/ /  %L)
      ;%L = (VALA1 VALA2 ... VALAN) ;
      (STATUS 1 3 8) ; force le bit trace EVAL et STEP ;
      (SETQ %X (EPROGN (CDDR (GET %F 'STEP))))
      (STATUS 2 3 8) ; enleve les bit speciaux ;
      (PRINT '<----- %F '/ /  %X))

   (DF UNSTEP (%F) 
      ; enleve la STEP des fonctions contenues dans %L ;
      (MAPC (OR %F STEP)
         '(LAMBDA (%F) 
            (PUT %F (GET %F 'STEP) (IF (GET %F EXPR) EXPR FEXPR))
            (REMPROP %F 'STEP)))
      %F)